package com.qf.controller;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.qf.pojo.R;
import com.qf.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

//@RestController
//@RequestMapping("/user")
//@DefaultProperties(defaultFallback = "defFallback")
public class UserController4 {

    @Autowired
    UserService userService;

    @Autowired
    private RestTemplate restTemplate;

    /*
        类级别的降级方法
            返回值必须和被保护资源一致
            参数列表为空（可以有一个异常参数）
     */
    public R defFallback(Throwable err){
        err.printStackTrace();

        return R.error().putMsg("默认降级....");
    }

    @GetMapping("/{id}")
    //HystrixCommand 注解标注哪些方法（资源）需要被保护
//    @HystrixCommand(fallbackMethod = "findOrders_fb")
    //使用类级别的降级方法
//    @HystrixCommand
    //对服务保护进行个性化配置
//    @HystrixCommand(commandProperties={
//            //配置超时时间,默认是1s
//            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "4000"),
//            //触发熔断需要达到的请求次数阈值
//            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "2"),
//            //触发熔断后，熔断时间
//            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
//            //触发熔断的请求错误比例
//            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50")
//    },threadPoolProperties={
//            //配置隔离线程池参数（设置核心线程数和最大线程数都为2）
//            @HystrixProperty(name = "coreSize",value = "2")
//    })

    //利用yml实现服务保护个性化配置
    @HystrixCommand
    public R findOrders(@PathVariable("id") Integer id) throws InterruptedException {
        if (id == 1) {
            int i = 1 / 0;
        }

        if (id == 2){
            Thread.sleep(3500);
        }

        if (id == 3){
            Thread.sleep(1000);
        }

        R r = restTemplate.getForObject("http://QF-ORDER/order/" + id, R.class);

        return r;
    }

    /*
        方法级别降级方法必须和被保护资源有相同的签名
            参数列表一致（可以在参数列表的最后，有一个额外参数--异常对象）
            返回值一致
     */
    public R findOrders_fb(Integer id,Throwable err) throws InterruptedException {

        //收集异常
        err.printStackTrace();

        return R.error().putMsg("降级了....");
    }
}
